package com.jade.modules.workflow;

import java.util.List;

import com.jade.framework.base.criterion.Criteria;
import com.jade.framework.base.util.PagingList;

/**
 * 简单的流程服务接口。复杂的话请使用专业的工作流程引擎。
 */
public interface FlowService
{
    /**
     * 流程执行。
     *
     * @param operatorType 操作者类型
     * @param operator 操作者
     * @param type 流程类型
     * @param entity 业务对象
     * @param step 执行的步骤
     * @param result 执行结果
     * @param remark 执行备注
     * @throws FlowException 处理异常
     */
    public void execute(String operatorType, String operator, String type, String entity, int step, int result,
                        String remark)
            throws FlowException;

    /**
     * 流程执行。
     *
     * @param operatorType 操作者类型
     * @param operator 操作者
     * @param applyId 流程申请标识
     * @param step 执行的步骤
     * @param result 执行结果
     * @param remark 执行备注
     * @throws FlowException 处理异常
     */
    public void execute(String operatorType, String operator, long applyId, int step, int result, String remark)
            throws FlowException;

    /**
     * 获取流程处理信息。
     *
     * @param type 流程类型
     * @param entity 业务对象
     * @return 流程处理信息
     */
    public FlowContext getContext(String type, String entity);

    /**
     * 获取流程处理信息。
     *
     * @param type 流程类型
     * @param applyId 申请标识
     * @return 流程处理信息
     */
    public FlowContext getContext(String type, long applyId);

    /**
     * 添加流程申请。
     *
     * @param apply 申请信息
     * @throws FlowException 处理异常
     */
    public void addApply(FlowApply apply)
            throws FlowException;

    /**
     * 编辑流程申请。
     *
     * @param apply 申请信息
     * @throws FlowException 处理异常
     */
    public void updateApply(FlowApply apply)
            throws FlowException;

    /**
     * 删除流程申请。
     *
     * @param ids 申请标识数组
     * @throws FlowException 处理异常
     */
    public void removeApply(long... ids)
            throws FlowException;

    /**
     * 获取申请信息。
     *
     * @param applyId 申请标识
     * @return 申请信息。
     */
    public FlowApply getApply(long applyId);

    /**
     * 根据条件查询申请信息。
     *
     * @param type 流程类型
     * @param criteria 查询条件
     * @return 申请列表
     */
    public PagingList<FlowApply> queryApply(String type, Criteria criteria);

    /**
     * 新增步骤角色设置。
     *
     * @param type 流程类型
     * @param step 步骤
     * @param roles 角色表示，多个以逗号分割
     * @throws FlowException 处理异常
     */
    public void addRole(String type, int step, String roles)
            throws FlowException;

    /**
     * 修改步骤角色设置。
     *
     * @param type 流程类型
     * @param step 步骤
     * @param roles 角色表示，多个以逗号分割
     * @throws FlowException 处理异常
     */
    public void setRole(String type, int step, String roles)
            throws FlowException;

    /**
     * 清除指定步骤的设置。
     *
     * @param type 流程类型
     * @param step  步骤
     * @throws FlowException 处理异常
     */
    public void clearRole(String type, int step)
            throws FlowException;

    /**
     * 清除一个流程类型的所有步骤角色设置。
     *
     * @param type 流程类型
     * @throws FlowException 处理异常
     */
    public void clearRole(String type)
            throws FlowException;

    /**
     * 列出指定类型流程所有步骤的角色设置。
     *
     * @param type 流程类型
     * @return 各个步骤的角色设置列表
     */
    public List<FlowRole> listRole(String type);

    /**
     * 获取指定步骤的角色设置。
     *
     * @param type 流程类型
     * @param step 步骤
     * @return 角色设置
     */
    public FlowRole getRole(String type, int step);


    /**
     * 分页查询流程操作历史记录。
     *
     * @param type 流程类型
     * @param entity 业务对象
     * @param criteria 查询条件
     * @return 满足条件的历史记录
     */
    public PagingList<FlowRecord> queryRecord(String type, String entity, Criteria criteria);

    /**
     * 分页查询流程申请操作历史记录。
     *
     * @param type 流程类型
     * @param applyId 申请标识
     * @param criteria 查询条件
     * @return 满足条件的历史记录
     */
    public PagingList<FlowRecord> queryRecord(String type, long applyId, Criteria criteria);

}
